<?php
/**
 * Limite les groupes à 1 seul élément pour un SW_Structure_Observer
 *
 * @author jonathan poelen <jonathan.poelen@gmail.com>
 * @version 1.1: jo_link_noir
 * @date 06-07-2010
 */
abstract class SW_Structure_Observer_Single extends SW_Structure_Observer
{
	/**
	 * @param SW_Player $player
	 * @param int $idPlanet
	 * @param SW_Dependency $dependency
	 * @param SW_I_DAO_Structure $dao
	 * @param string $classElement = self::CLASS_ELEMENT : le type de l'élément est vérifier uniquement dans le passage à la méthode add()
	 * @param string $classException = self::CLASS_EXCEPTION
	 * @note ajoute un errorMessages code 100 : 'impossible d\'ajouté un élément, le groupe existe déjà'
	 */
	public function __construct(SW_Player $player, $idPlanet, SW_Dependency $dependency, SW_Structure_DAO_Interface $dao, $classElement = self::CLASS_ELEMENT, $classException = self::CLASS_EXCEPTION)
	{
		parent::__construct($player, $idPlanet, $dependency, $dao, $classElement, $classException);

		$this->errorMessages[100] = 'impossible d\'ajouté un élément, le groupe existe déjà';
	}

	/**
	 * Ajoute un élement
	 * @param SW_Structure_Subject_Element $element
	 * @exception SW_Structure_Exception
	 */
	public function add(SW_Element $element)
	{
		if (isset($this->groupElements[$element->getGroup()]))
			throw new $this->classException($this->errorMessages[100], 100);

		parent::add($element);
	}

	/**
	 * Crée un élément et l'ajoute, retourne l'id de la structure créé si réussi, sinon false
	 * @param int $group
	 * @param int $level = 0
	 * @return int|false
	 * @exception SW_Structure_Exception
	 */
	public function createElement($group, $level=0)
	{
		if (isset($this->groupElements[$group]))
			throw new $this->classException($this->errorMessages[100], 100);

		return parent::createElement($group, $level);
	}
}